#include "beep.h"
#include "ui_beep.h"

beep::beep(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::beep)
{
    ui->setupUi(this);
    ui->label->setStyleSheet("color: rgb(255, 255, 255);");
    ui->pushButton->setStyleSheet("color: rgb(255, 255, 255);");
    ui->pushButton_2->setStyleSheet("color: rgb(255, 255, 255);");
    ui->pushButton_3->setStyleSheet("color: rgb(255, 255, 255);");
    QPalette pal = this->palette();
    pal.setBrush(QPalette::Background,QBrush(QPixmap("./bg.jpg")));
    setPalette(pal);
    // ==================== 图片显示功能 - 修复实现 ====================
    // 1. 创建绝对路径 - 针对开发板的固定路径
    QString imagePath = "./alarm.jpg";



    // 3. 加载图片并处理错误
    QPixmap alarmPixmap(imagePath);

    if(alarmPixmap.isNull()) {
        QString errorMsg = QString("警告: 无法加载图片: %1\n错误: %2")
                                  .arg(imagePath)
                                  .arg(strerror(errno));

        qDebug() << errorMsg;

        // 在界面显示详细错误信息
        ui->label->setText(errorMsg);
        ui->label->setStyleSheet("color: red;"); // 设置红色文本突出显示


    } else {
        qDebug() << "图片成功加载:" << imagePath;

        // 显示图片
        ui->label->setPixmap(
            alarmPixmap.scaled(
                ui->label->width(),
                ui->label->height(),
                Qt::KeepAspectRatio,
                Qt::SmoothTransformation
            )
        );
        ui->label->setAlignment(Qt::AlignCenter);
    }

    // 设置按钮文本
    ui->pushButton->setText("返回");
    ui->pushButton_2->setText("打开");
    ui->pushButton_3->setText("关闭");
    ui->pushButton->setStyleSheet("border-image: url(./btn1.jpg);");
    ui->pushButton_2->setStyleSheet("border-image: url(./btn1.jpg);");
    ui->pushButton_3->setStyleSheet("border-image: url(./btn1.jpg);");
    // 尝试打开蜂鸣器设备
    beep_fd = ::open(device_path, O_RDWR);

    if(beep_fd < 0) {
        // 获取详细的错误信息
        QString errorStr = QString("打开蜂鸣器失败: %1 (错误代码: %2)")
                                  .arg(strerror(errno))
                                  .arg(errno);
        qDebug() << errorStr;

        // 显示错误信息
        ui->statusbar->showMessage(errorStr, 5000);

        // 弹出错误对话框
        QMessageBox::critical(this, "设备错误", errorStr);

        // 禁用控制按钮
        ui->pushButton_2->setEnabled(false);
        ui->pushButton_3->setEnabled(false);
    } else {
        qDebug() << "蜂鸣器设备成功打开，文件描述符:" << beep_fd;
        ui->statusbar->showMessage("蜂鸣器已就绪", 3000);
    }
}

beep::~beep()
{
    // 确保安全关闭设备
    if (beep_fd >= 0) {
        // 先尝试关闭蜂鸣器
        if (ioctl(beep_fd, OFF, 1) < 0) {
            qDebug() << "关闭蜂鸣器错误:" << strerror(errno);
        }

        // 关闭设备文件
        if (::close(beep_fd) < 0) {
            qDebug() << "关闭设备文件错误:" << strerror(errno);
        } else {
            qDebug() << "设备文件成功关闭";
        }
    }

    delete ui;
}

// 返回主窗口
void beep::on_pushButton_clicked()
{
    if (QWidget *parent = this->parentWidget()) {
        parent->show();     // 显示父窗口
        parent->raise();    // 置顶显示
    }

    this->close(); // 关闭当前蜂鸣器窗口
}

// 打开蜂鸣器
void beep::on_pushButton_2_clicked()
{
    if (beep_fd < 0) {
        QMessageBox::warning(this, "设备错误", "蜂鸣器设备不可用");
        return;
    }

    // 使用条件编译后的ioctl函数
    if (ioctl(beep_fd, ON, 1) < 0) {
        QString errorStr = QString("打开蜂鸣器失败: %1").arg(strerror(errno));
        QMessageBox::critical(this, "控制错误", errorStr);
        qDebug() << errorStr;
    } else {
        qDebug() << "蜂鸣器已打开";
        ui->statusbar->showMessage("蜂鸣器已开启", 2000);
    }
}

// 关闭蜂鸣器
void beep::on_pushButton_3_clicked()
{
    if (beep_fd < 0) {
        QMessageBox::warning(this, "设备错误", "蜂鸣器设备不可用");
        return;
    }

    // 使用条件编译后的ioctl函数
    if (ioctl(beep_fd, OFF, 1) < 0) {
        QString errorStr = QString("关闭蜂鸣器失败: %1").arg(strerror(errno));
        QMessageBox::critical(this, "控制错误", errorStr);
        qDebug() << errorStr;
    } else {
        qDebug() << "蜂鸣器已关闭";
        ui->statusbar->showMessage("蜂鸣器已关闭", 2000);
    }
}
